home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / fft32010.arc / PROGRAM.4 < prev    next >
Encoding:
Text File  |  1984-11-13  |  7.1 KB  |  367 lines

  1.       IDT 'FFT4'
  2. *
  3. *    Cooley-Tukey Radix-4, DIF FFT Program
  4. *
  5. *    Single radix-4 butterfly.
  6. *    Complex input data - size limited only by program memory availability.
  7. *    Uses table lookup of twiddle factors.
  8. *    No scaling is done on intermediate values in the program.
  9. *    External data RAM is addressed via peripheral I/O instructions.
  10. *        An address counter is required and is loaded by a write
  11. *        to port 0.  Data is read from and written to port 1.
  12. *    Data in the external RAM assumes complex data with corresponding
  13. *        real and imaginary data values in consecutive locations.
  14. *
  15. * N is the size of the transform (N = 4**M).
  16. N EQU 64
  17. M EQU 3
  18. *
  19. * Data memory allocation.
  20. *
  21. XI     EQU 0        * Data values for butterfly
  22. YI     EQU 1
  23. XI1    EQU 2
  24. YI1    EQU 3
  25. XI2    EQU 4
  26. YI2    EQU 5
  27. XI3    EQU 6
  28. YI3    EQU 7
  29. I      EQU 8        * Data indices
  30. I1     EQU 9
  31. I2     EQU 10
  32. I3     EQU 11
  33. CO1    EQU 12        * Twiddle factor coefficients
  34. CO2    EQU 13
  35. CO3    EQU 14
  36. SI1    EQU 15
  37. SI2    EQU 16
  38. SI3    EQU 17
  39. N1     EQU 18        * Increment to I
  40. N2     EQU 19        * Index separation
  41. IA     EQU 20        * Index to twiddle factors
  42. IE     EQU 21        * Increment to IA
  43. J      EQU 22        * Counters
  44. K      EQU 23
  45. R1     EQU 24        * Temporaries
  46. R2     EQU 25
  47. S1     EQU 26
  48. S2     EQU 27
  49. R3     EQU 28
  50. R4     EQU 29
  51. S3     EQU 30
  52. S4     EQU 31
  53. XJ     EQU 32
  54. YJ     EQU 33
  55. TEMP   EQU 34
  56. HOLDN  EQU 35        * Contains the value N
  57. QUARTN EQU 36        * Contains the value N/4
  58. ONE    EQU 37        * Contains the value 1
  59. TABLE  EQU 38        * Location of coefficient table
  60. *
  61. * Begin program memory section.
  62. *
  63.       AORG 0
  64. START      LDPK 0
  65.       LACK 1
  66.       SACL IE          * Initialize IE = 1
  67.       SACL ONE
  68.       LT   ONE
  69.       MPYK SINE
  70.       PAC
  71.       SACL TABLE          * Save address of coefficient table
  72.       MPYK N
  73.       PAC
  74.       SACL HOLDN
  75.       SACL N2          * Initialize N2 = N
  76.       LAC  HOLDN,14
  77.       SACH QUARTN          * QUARTN = N/4
  78.       LARK AR0,M-1          * AR0 contains K value
  79. KLOOP         LARP 1
  80.          LAC  N2
  81.          SACL N1          * N1 = N2
  82.          LAC  N2,14
  83.          SACH N2          * N2 = N2/4
  84.          ZAC
  85.          SACL J
  86.          SACL IA
  87.          LAR  AR1,N2      * AR1 contains J value
  88.          MAR  *-          * Start at N2-1
  89. JLOOP        LAC  TABLE
  90.         ADD  IA
  91.         TBLR SI1      * Get twiddle factor 1
  92.         ADD  QUARTN
  93.         TBLR CO1
  94.         LAC  TABLE
  95.         ADD  IA,1
  96.         TBLR SI2      * Get twiddle factor 2
  97.         ADD  QUARTN
  98.         TBLR CO2
  99.         LAC  TABLE
  100.         ADD  IA,1
  101.         ADD  IA
  102.         TBLR SI3      * Get twiddle factor 3
  103.         ADD  QUARTN
  104.         TBLR CO3
  105.         LAC  IA
  106.         ADD  IE
  107.         SACL IA     * IA = IA + IE
  108.         LAC  J,1
  109.         SACL I        * I = J (data organized ar real value followed
  110. *                * by imaginary so address I is 2 times J).
  111. ILOOP           LAC    I
  112.            ADD    N2,1
  113.            SACL I1        * I1 = I + N2
  114.            ADD    N2,1
  115.            SACL I2        * I2 = I1 + N2
  116.            ADD    N2,1
  117.            SACL I3        * I3 = I2 + N2
  118. *
  119.            OUT    I,PA0        * Output address of XI
  120.            IN    XI,PA1        * Read real and imaginary parts
  121.            IN    YI,PA1
  122.            OUT    I1,PA0         * Output address of XI1
  123.            IN    XI1,PA1      * Read real and imaginary parts
  124.            IN    YI1,PA1
  125.            OUT    I2,PA0         * Output address of XI2
  126.            IN    XI2,PA1      * Read real and imaginary parts
  127.            IN    YI2,PA1
  128.            OUT    I3,PA0         * Output address of XI3
  129.            IN    XI3,PA1      * Read real and imaginary parts
  130.            IN    YI3,PA1
  131. *
  132. * Compute butterfly.
  133. *
  134.            LAC    XI
  135.            ADD    XI2
  136.            SACL R1        * R1 = X(I) + X(I2)
  137.            SUB    XI2,1
  138.            SACL R3        * R3 = X(I) - X(I2)
  139.            LAC    YI
  140.            ADD    YI2
  141.            SACL S1        * S1 = Y(I) + Y(I2)
  142.            SUB    YI2,1
  143.            SACL S3        * S3 = Y(I) - Y(I2)
  144.            LAC    XI1
  145.            ADD    XI3
  146.            SACL R2        * R2 = X(I1) + X(I3)
  147.            SUB    XI3,1
  148.            SACL R4        * R4 = X(I1) - X(I3)
  149.            LAC    YI1
  150.            ADD    YI3
  151.            SACL S2        * S2 = Y(I1) + Y(I3)
  152.            SUB    YI3,1
  153.            SACL S4        * S4 = Y(I1) - Y(I3)
  154. *
  155.            LAC    R1
  156.            ADD    R2
  157.            SACL XI        * X(I) = R1 + R2
  158.            SUB    R2,1
  159.            SACL R2        * R2 = R1 - R2
  160.            LAC    R3
  161.            SUB    S4
  162.            SACL R1        * R1 = R3 - S4
  163.            ADD    S4,1
  164.            SACL R3        * R3 = R3 + S4
  165. *
  166.            LAC    S1
  167.            ADD    S2
  168.            SACL YI        * Y(I) = S1 + S2
  169.            SUB    S2,1
  170.            SACL S2        * S2 = S1 - S2
  171.            LAC    S3
  172.            ADD    R4
  173.            SACL S1        * S1 = S3 + R4
  174.            SUB    R4,1
  175.            SACL S3        * S3 = S3 - R4
  176. *
  177.            LT    CO1
  178.            MPY    S3
  179.            PAC
  180.            LT    SI1
  181.            MPY    R3
  182.            SPAC
  183.            SACH YI1,1        * Y(I1) = CO1*S3 - SI1*R3
  184.            MPY    S3
  185.            PAC
  186.            LT    CO1
  187.            MPY    R3
  188.            LTA    CO2
  189.            SACH XI1,1        * X(I1) = CO1*R3 + SI1*S3
  190.            MPY    S2
  191.            PAC
  192.            LT    SI2
  193.            MPY    R2
  194.            SPAC
  195.            SACH YI2,1        * Y(I2) = CO2*S2 - SI2*R2
  196.            MPY    S2
  197.            PAC
  198.            LT    CO2
  199.            MPY    R2
  200.            LTA    CO3
  201.            SACH XI2,1        * X(I2) = CO2*R2 + SI2*S2
  202.            MPY    S1
  203.            PAC
  204.            LT    SI3
  205.            MPY    R1
  206.            SPAC
  207.            SACH YI3,1        * Y(I3) = CO3*S1 - SI3*R1
  208.            MPY    S1
  209.            PAC
  210.            LT    CO3
  211.            MPY    R1
  212.            APAC
  213.            SACH XI3,1        * X(I3) = CO3*R1 + SI3*S1
  214. *
  215. * Output results of the butterfly.
  216. *
  217.            OUT    I,PA0
  218.            OUT    XI,PA1
  219.            OUT    YI,PA1
  220.            OUT    I1,PA0
  221.            OUT    XI1,PA1
  222.            OUT    YI1,PA1
  223.            OUT    I2,PA0
  224.            OUT    XI2,PA1
  225.            OUT    YI2,PA1
  226.            OUT    I3,PA0
  227.            OUT    XI3,PA1
  228.            OUT    YI3,PA1
  229. *
  230. * Add increment for next loop.
  231. *
  232.            LAC    I
  233.            ADD    N1,1
  234.            SACL I        * I = I + N1
  235.            SUB    HOLDN,1
  236.            BLZ    ILOOP
  237.            LAC  J
  238.            ADD  ONE
  239.            SACL J            * J = J + 1
  240.            BANZ JLOOP
  241.         LAC  IE,2
  242.         SACL IE            * IE = IE*4
  243.         LARP 0
  244.         BANZ KLOOP
  245. *
  246. * Digit reverse counter for radix-4 FFT computation.
  247. *
  248. DRC4    ZAC
  249.     SACL J
  250.     SACL I
  251.     LARP 0
  252.     LAR  AR0,HOLDN
  253.     MAR  *-
  254.     MAR  *-
  255. DRLOOP        SUB  J
  256.         BGEZ NOSWAP
  257. *
  258. * Swap I and J locations.
  259. *
  260.             OUT  I,PA0
  261.             IN   XI,PA1
  262.             IN   YI,PA1
  263.             OUT  J,PA0
  264.             IN   XJ,PA1
  265.             IN   YJ,PA1
  266.             OUT  J,PA0
  267.             OUT  XI,PA1
  268.             OUT  YI,PA1
  269.             OUT  I,PA0
  270.             OUT  XJ,PA1
  271.             OUT  YJ,PA1
  272. NOSWAP        LAC  QUARTN,1
  273.         SACL K
  274. INLOOP            LT   K
  275.             MPYK 3
  276.             PAC
  277.             SACL TEMP
  278.             SUB  J
  279.             BGZ  OUTL
  280.                 LAC  J
  281.                 SUB  TEMP
  282.                 SACL J
  283.                 LAC  K,14
  284.                 SACH K
  285.                 B    INLOOP
  286. OUTL        LAC  J
  287.         ADD  K
  288.         SACL J
  289.         LAC  I
  290.         ADD  ONE,1
  291.         SACL I
  292.         BANZ DRLOOP
  293. *
  294. * End of FFT.
  295. *
  296. STOP  B STOP
  297. *
  298. * Sine and cosine tables for coefficients.
  299. *
  300. SINE EQU $
  301.       DATA 0
  302.       DATA 3211
  303.       DATA 6392
  304.       DATA 9511
  305.       DATA 12539
  306.       DATA 15446
  307.       DATA 18204
  308.       DATA 20787
  309.       DATA 23169
  310.       DATA 25329
  311.       DATA 27244
  312.       DATA 28897
  313.       DATA 30272
  314.       DATA 31356
  315.       DATA 32137
  316.       DATA 32609
  317. COSINE EQU $
  318.       DATA 32767
  319.       DATA 32609
  320.       DATA 32137
  321.       DATA 31356
  322.       DATA 30272
  323.       DATA 28897
  324.       DATA 27244
  325.       DATA 25329
  326.       DATA 23169
  327.       DATA 20787
  328.       DATA 18204
  329.       DATA 15446
  330.       DATA 12539
  331.       DATA 9511
  332.       DATA 6392
  333.       DATA 3211
  334.       DATA 0
  335.       DATA -3211
  336.       DATA -6392
  337.       DATA -9511
  338.       DATA -12539
  339.       DATA -15446
  340.       DATA -18204
  341.       DATA -20787
  342.       DATA -23169
  343.       DATA -25329
  344.       DATA -27244
  345.       DATA -28897
  346.       DATA -30272
  347.       DATA -31356
  348.       DATA -32137
  349.       DATA -32609
  350.       DATA -32767
  351.       DATA -32609
  352.       DATA -32137
  353.       DATA -31356
  354.       DATA -30272
  355.       DATA -28897
  356.       DATA -27244
  357.       DATA -25329
  358.       DATA -23169
  359.       DATA -20787
  360.       DATA -18204
  361.       DATA -15446
  362.       DATA -12539
  363.       DATA -9511
  364.       DATA -6392
  365.       DATA -3211
  366.       END
  367.